package com.xyq.friend.service.message;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xyq.common.core.constants.Constants;
import com.xyq.common.core.domain.PageDomain;
import com.xyq.common.core.domain.TableDataInfo;
import com.xyq.common.core.enums.ResultCode;
import com.xyq.common.core.exception.ServiceException;
import com.xyq.common.core.utils.ThreadLocalUtil;
import com.xyq.friend.domain.message.Message;
import com.xyq.friend.domain.message.MessageText;
import com.xyq.friend.domain.message.MessageVO;
import com.xyq.friend.manager.MessageCacheManager;
import com.xyq.friend.mapper.MessageMapper;
import com.xyq.friend.mapper.MessageTextMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserMessageServiceImpl implements UserMessageService {

    @Autowired
    private MessageCacheManager messageCacheManager;

    @Autowired
    private MessageMapper messageMapper ;

    @Autowired
    private MessageTextMapper messageTextMapper ;

    @Override
    public TableDataInfo list(PageDomain pageDomain) {
        // 从ThreadLocal 获取userId
        Long userId = ThreadLocalUtil.get(Constants.USER_ID, Long.class);

        //  从redis里获取数据
        // 1. 先判断redis里有没有数据 , 如果没有数据要去 MySQL里查
        Long listSize = messageCacheManager.getListSize( userId);
        List<MessageVO> messageVOList;
        // 如果 redis里没有这个列表的数据
        if (listSize == null || listSize <= 0) {
            // 1. 为空就从数据库里查询
            // 维护分页
            PageHelper.startPage(pageDomain.getPageNum(), pageDomain.getPageSize());
            messageVOList = messageTextMapper.selectMessageVOList(userId);
            // 2. 同时 刷新 redis里的缓存数据
            messageCacheManager.refreshCache(userId);
            listSize = new PageInfo<>(messageVOList).getTotal();
        } else {
            // 如果redis里的数据不为空 ,就去redis里获取竞赛列表数据
            messageVOList = messageCacheManager.getMeesageVOList( pageDomain,userId);
            listSize = messageCacheManager.getListSize( userId);
        }
        // 返回 查询到的消息列表, 同时加上 total 列表总数
        // 不能使用 TableDataInfo的方法来获取total , 但是上面的 listSize 就是获取到的列表总数
        // 获取 总数 ,
        // 判断list是否为null
        if (CollectionUtil.isEmpty(messageVOList)) {
            return TableDataInfo.empty();    // 如果list是空返回empty（） ；
        }

        return TableDataInfo.success(messageVOList, listSize);
    }

    @Override
    public int delete(Long messageTextId) {
        MessageText messageText = messageTextMapper.selectById(messageTextId);
        Message message = messageMapper.selectOne(new LambdaQueryWrapper<Message>()
                .eq(Message::getMessageTextId, messageTextId));
        if(messageText == null || message == null){
            throw new ServiceException(ResultCode.MESSAGE_NOT_EXISTS);
        }
        // 删除缓存
        messageCacheManager.deleteCache(messageTextId);

      return   (messageMapper.deleteById(message) + messageTextMapper.deleteById(messageText)) >1 ? 1: 0;
    }
}
